using System;
using System.Collections.Generic;
using System.Linq;
using Engine;
using Engine.Objects;
using Engine.Components;
using Engine.GUI;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Demos
{
    /// <summary>
    /// Это главный тип игры
    /// </summary>
    public class Demo : NOWAEngine
    {
        BasicEffect eff;
        SpriteBatch spriteBatch;
        GUI.LoginForm form;
        GUI.SelectForm sele;
        GUI.Statys stat;
        string ip,port;

        public Demo():base()
        {
            //graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
             //Engine.GUI.GUIDefaultButton b = new Engine.GUI.GUIDefaultButton(this, "Кнопке");
            //(Manager.GetComponent("SceneManager") as Engine.Components.SceneManager).addObject(b);
          //  (Manager.GetComponent("SceneManager") as Engine.Components.SceneManager).Initialize();
        }

        /// <summary>
        /// Позволяет игре выполнить инициализацию, необходимую перед запуском.
        /// Здесь можно запросить нужные службы и загрузить неграфический
        /// контент.  Вызов base.Initialize приведет к перебору всех компонентов и
        /// их инициализации.
        /// </summary>
        protected override void Initialize()
        {
            // ЗАДАЧА: добавьте здесь логику инициализации
            eff = new BasicEffect(GraphicsDevice);
           
           // Manager.GetComponent("SceneManager").addObject(b);
            base.Initialize();
            sele = new GUI.SelectForm((Manager.GetComponent("SceneManager") as Engine.Components.SceneManager).CurrentScene.GUIManager);
            sele.button1.Click += new TomShane.Neoforce.Controls.EventHandler(button1_Click);
            sele.Init();
            form= new GUI.LoginForm((Manager.GetComponent("SceneManager") as Engine.Components.SceneManager).CurrentScene.GUIManager);
            form.Okbtn.Click += new TomShane.Neoforce.Controls.EventHandler(Okbtn_Click);
            form.Cancelbtn.Click += new TomShane.Neoforce.Controls.EventHandler(Cancelbtn_Click); 
            form.Init();
            stat = new GUI.Statys((Manager.GetComponent("SceneManager") as Engine.Components.SceneManager).CurrentScene.GUIManager);           
            stat.Init();
            (Manager.GetComponent("SceneManager") as Engine.Components.SceneManager).CurrentScene.GUIManager.Add(form);
            (Manager.GetComponent("SceneManager") as Engine.Components.SceneManager).CurrentScene.GUIManager.Add(sele);
            (Manager.GetComponent("SceneManager") as Engine.Components.SceneManager).CurrentScene.GUIManager.Add(stat);
        }

        void Cancelbtn_Click(object sender, TomShane.Neoforce.Controls.EventArgs e)
        {
            if (form.LoginBox.Text.Length > 0 && form.PassBox.Text.Length > 0)
            {

                Engine.Client.BaseClient cl = BaseInputManager.GetNetClient;
                Engine.NetClasses.RequestLoginAuth r = (Engine.NetClasses.RequestLoginAuth)Engine.NetClasses.NetPacket.GetPacket(3);

                r.SetLoginAndPass(form.LoginBox.Text, form.PassBox.Text);
                Engine.NetClasses.PacketsBilder pb = new Engine.NetClasses.PacketsBilder(r);
                byte[] t = pb.getPacket();
                //byte[] bigPack = new byte[t.Length * 10000];
                for (int i = 0; i < 10000; i++)
                {
                    cl.SetFromClient(pb);
                   // Array.Copy(t, 0, bigPack, i * t.Length, t.Length);
                }
              //  cl.SetFromClient(bigPack);
                System.Text.StringBuilder sb = new System.Text.StringBuilder(stat.Packets.Text);
                sb.AppendLine("Send  packs 10000 in 1:");
                sb.AppendLine("" +
                        r.ToString()
                        );
                stat.Packets.Text = sb.ToString();
            }
        }

        void button1_Click(object sender, TomShane.Neoforce.Controls.EventArgs e)
        {

            Engine.Client.BaseClient cl = BaseInputManager.GetNetClient;
            cl.SetIPandPort(sele.IP.Text,int.Parse(sele.Port.Text));
            cl.Start();
            sele.button1.Enabled = false;
            sele.IP.Enabled = false;
            sele.Port.Enabled = false;
            System.Text.StringBuilder sb = new System.Text.StringBuilder(stat.Packets.Text);
            sb.AppendLine("Connect to server:");            
            stat.Packets.Text = sb.ToString();
        }

        void Okbtn_Click(object sender, TomShane.Neoforce.Controls.EventArgs e)
        {
            TomShane.Neoforce.Controls.Manager ma=BaseSceneManager.CurrentScene.GUIManager;
            if (form.LoginBox.Text.Length > 0 && form.PassBox.Text.Length > 0)
            {

                Engine.Client.BaseClient cl = BaseInputManager.GetNetClient;
               Engine.NetClasses.RequestLoginAuth r=  (Engine.NetClasses.RequestLoginAuth) Engine.NetClasses.NetPacket.GetPacket(3);
                
                r.SetLoginAndPass(form.LoginBox.Text, form.PassBox.Text);
                Engine.NetClasses.PacketsBilder pb = new Engine.NetClasses.PacketsBilder(r);
                cl.SetFromClient(pb);
                System.Text.StringBuilder sb = new System.Text.StringBuilder(stat.Packets.Text);
                sb.AppendLine("Send  packs:");
                sb.AppendLine("" +
                        r.ToString()
                        );
                stat.Packets.Text = sb.ToString();
            }
            
            
        }

        /// <summary>
        /// LoadContent будет вызываться в игре один раз; здесь загружается
        /// весь контент.
        /// </summary>
        protected override void LoadContent()
        {
            // Создайте новый SpriteBatch, который можно использовать для отрисовки текстур.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // ЗАДАЧА: используйте здесь this.Content для загрузки контента игры
        }

        /// <summary>
        /// UnloadContent будет вызываться в игре один раз; здесь выгружается
        /// весь контент.
        /// </summary>
        protected override void UnloadContent()
        {
            // ЗАДАЧА: выгрузите здесь весь контент, не относящийся к ContentManager
        }

        /// <summary>
        /// Позволяет игре запускать логику обновления мира,
        /// проверки столкновений, получения ввода и воспроизведения звуков.
        /// </summary>
        /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
        protected override void Update(GameTime gameTime)
        {
            // Позволяет выйти из игры
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            Engine.Client.BaseClient cl = BaseInputManager.GetNetClient;
            Engine.NetClasses.PacketsBilder[] packs = cl.GetFromServer();
            if (cl.Connected)
            {
                stat.Connect.Text = "Connected";
                stat.Connect.TextColor= Color.Green;
              

            }
            else
            {
                stat.Connect.Text = "Not connected";
                stat.Connect.TextColor = Color.Red;
            }
            if (packs.Length>0)
            {

                System.Text.StringBuilder sb = new System.Text.StringBuilder(stat.Packets.Text);
                sb.AppendLine("Read " + packs.Length + " packs:");
                for (int i = 0; i < packs.Length; i++)
                {
                    string s=(packs[i].getStryct().ToString());
                    sb.AppendLine("pack " + i + ": " +
                        s
                        );

                }
                
                stat.Packets.Text = sb.ToString();
            }
            // ЗАДАЧА: добавьте здесь логику обновления

            base.Update(gameTime);
        }

        /// <summary>
        /// Вызывается, когда игра отрисовывается.
        /// </summary>
        /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
        protected override void Draw(GameTime gameTime)
        {
           
          //  GraphicsDevice.Clear(Color.CornflowerBlue);

            DepthStencilState s = new DepthStencilState();
            s.DepthBufferEnable = true;
            graphics.GraphicsDevice.DepthStencilState = s;
            RasterizerState r = new RasterizerState();
            r.CullMode = CullMode.None;
            graphics.GraphicsDevice.RasterizerState = r;

           DEFAULTCamera cam = (DEFAULTCamera)((CameraManager)Manager.GetComponent("CameraManager")).GetMaincamera();

            eff.View = cam.ViewMatrix;
            eff.Projection = cam.ProjectionMatrix;
            eff.World = Matrix.Identity;
            eff.VertexColorEnabled = true;
            VertexPositionColor[] ver = new VertexPositionColor[6];
            ver[0] = new VertexPositionColor(new Vector3(0, 0, 0), Color.Black);
            ver[1] = new VertexPositionColor(new Vector3(1, 0, 0), Color.Violet);
            ver[2] = new VertexPositionColor(new Vector3(0, 1, 0), Color.Wheat);
            ver[3] = new VertexPositionColor(new Vector3(0, 0, 0), Color.Black);
            ver[5] = new VertexPositionColor(new Vector3(1, 0, 0), Color.Violet);
            ver[4] = new VertexPositionColor(new Vector3(0, 1, 0), Color.Wheat);
            //ver[0] = new VertexPositionColor(new Vector3(1, 0, 10), Color.Violet);

            foreach (EffectPass pass in eff.Techniques[0].Passes)
            {
                pass.Apply();
                GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.TriangleList, ver, 0, 2);
            }
            // ЗАДАЧА: добавьте здесь код отрисовки

             base.Draw(gameTime);
        }
    }
}
